package com.sj;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.List;

public class PhoneDom4J {
    //以下所有的实现方式全是Dom4J实现
    //上机1
    /*
    创建保存手机品牌为华为，型号为P90
    手机品牌为苹果，型号为iPhone Z和iPhone ZL等手机信息的xml文档
    使用Dom解析读取xml文档信息并显示
     */
    @Test
    public void testAddNode()throws Exception{
        SAXReader reader=new SAXReader();
        //读取
        Document doc=reader.read(new File("src/main/resources/Phone_01.xml"));
        //获取根节点
        Element phoneInfoEl=doc.getRootElement();

        phoneInfoEl.addElement("Brand")
                .addAttribute("name","华为")
                .addElement("Type")
                .addAttribute("name","P90");
        phoneInfoEl.addElement("Brand")
                .addAttribute("name","苹果")
                .addElement("Type")
                .addAttribute("name","iPhone Z")
                .addElement("Type")
                .addAttribute("name","iPhone ZL");

        FileWriter fw=new FileWriter("src/main/resources/Phone_01.xml");
        doc.write(fw);
        fw.close();
    }
    //使用DOM循环读取显示
    @Test
    public void testDomReader()throws Exception{
      SAXReader reader=new SAXReader();
      //读取
        Document doc=reader.read(new File("src/main/resources/Phone_01.xml"));
        //获取根节点
        Element phoneInfoEl=doc.getRootElement();
        //得到一个list列表
        List<Element> brandEls=phoneInfoEl.elements("Brand");
        for(Element Elements:brandEls){
            String brandName=Elements.attributeValue("name");
            List<Element> typeEls=Elements.elements("Type");
            for(Element typeEl:typeEls){
                String typeName=typeEl.attributeValue("name");
                System.out.println("手机品牌："+brandName+"，型号："+typeName);
            }
        }
    }


    /**
     * 上机2
     * 在xml文档中添加品牌为"三星"，型号为"NoteX"的节点
     * 在xml文档中品牌信息"三星"修改为"SAMSUNG"
     * 在xml文档中将品牌信息为"SAMSUNG"的节点删除
     * 修改后的DOM树保存到xml文档
     */

    //在xml文档中添加品牌为"三星"，型号为"NoteX"的节点，使用指定位置添加
    @Test
    public void testIndexAdd()throws Exception{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/main/resources/Phone_01.xml"));

        //得到第二个student标签
//        Element student = (Element)
//                document.getRootElement().elements("student").get(1);
        Element phoneInfoEl=document.getRootElement();
        List list = phoneInfoEl.elements();  //得到所有子结点[name,id,age]

        //创建新的结点
        Element brandEl1 = DocumentHelper.createElement("Brand");
        brandEl1.addAttribute("name","三星");
        Element brandEl2 = DocumentHelper.createElement("Type");
        brandEl2.addAttribute("name","NoteX");
        //插入新的结点,list变成了[name,address,id,age]，原来1后面的元素往后移动了一个位置
        list.add(1,brandEl1);
        list.add(2,brandEl2);
        //重新写入
        //如果我们的xml编码格式为gb2312的话，那么字符集应该设置成format.setEncoding("gb2312");
        //也就是xml的字符集和匹配器设置的字符集得一致
        OutputFormat format = OutputFormat.createPrettyPrint();
        //这里指定的格式要和xml文档的编码格式一致，否则会出现乱码
        format.setEncoding("utf-8");

        //FileOutputStream的编码也是按照format设置的字符集进行编码
        XMLWriter writer = new XMLWriter(
                new FileOutputStream( "src/main/resources/Phone_01.xml" ), format );

            //写入
            writer.write( document);

        //关闭
        writer.close();

    }

    //在xml文档中品牌信息"三星"修改为"SAMSUNG"
    @Test
    public void testUpdate()throws  Exception{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/main/resources/Phone_01.xml"));
        List studentlist = document.getRootElement().elements("Brand"); //找到所有的Brand节点
        Element student2 = (Element) studentlist.get(1);   //取出第2个Brand节点
//        //取得所有属性
//        List attributes = student2.elements();
//        Element e = (Element) attributes.get(0);

        //更新其中的文本内容
        student2.setText("SAMSUNG");
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");
        XMLWriter writer = new XMLWriter(
                new FileOutputStream( "src/main/resources/Phone_01.xml" ), format );
        writer.write( document);
        writer.close();
    }


    //在xml文档中将品牌信息为"SAMSUNG"的节点删除
    @Test
    public void testDelete()throws  Exception{
     SAXReader reader=new SAXReader();
     Document doc=reader.read("src/main/resources/Phone_01.xml");

     List list=doc.getRootElement().elements("Brand");
     Element brandEl=(Element) list.get(1);

        brandEl.getParent().remove(brandEl); //找到父元素，在删除自己
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");

        XMLWriter writer = new XMLWriter(
                new FileOutputStream( "src/main/resources/Phone_01.xml" ), format );
        writer.write(doc);
        writer.close();
    }

}
